// src/composables/useLogin.js
import { ref, onMounted, onUnmounted } from 'vue'
import { useUserStore } from '@/store/user'
import { ElMessage } from 'element-plus'

/**
 * 登录功能组合式API
 */
export function useLogin() {
    const userStore = useUserStore()

    // 登录模态框状态
    const showLoginModal = ref(false)
    const loginModalMode = ref('login') // 'login' | 'register'

    /**
     * 显示登录模态框
     * @param {string} mode - 模式：'login' | 'register'
     */
    const openLoginModal = (mode = 'login') => {
        loginModalMode.value = mode
        showLoginModal.value = true
    }

    /**
     * 关闭登录模态框
     */
    const closeLoginModal = () => {
        showLoginModal.value = false
    }

    /**
     * 登录成功回调
     * @param {Object} result - 登录结果
     */
    const handleLoginSuccess = (result) => {
        ElMessage.success('登录成功！')
        // userStore.isAuthenticated = true
        closeLoginModal()

        // 可以在这里执行其他登录成功后的操作
        // 比如跳转页面、刷新数据等
        console.log('登录成功:', result)
    }

    /**
     * 登出
     */
    const handleLogout = async () => {
        try {
            const result = await userStore.logout()
            if (result.success) {
                ElMessage.success(result.message)

                // 登出成功后的操作
                // 比如跳转到首页等
                console.log('登出成功')
            }
        } catch (error) {
            console.error('登出失败:', error)
            ElMessage.error('登出失败')
        }
    }

    /**
     * 检查登录状态
     */
    const checkAuthStatus = () => {
        if (!userStore.isAuthenticated) {
            openLoginModal('login')
            return false
        }
        return true
    }

    /**
     * token过期事件处理器
     */
    const handleTokenExpired = () => {
        ElMessage.warning('登录已过期，请重新登录')
        openLoginModal('login')
    }

    // 监听token过期事件
    onMounted(() => {
        // 初始化用户状态
        userStore.initUserState()

        // 监听token过期事件
        window.addEventListener('token-expired', handleTokenExpired)
    })

    onUnmounted(() => {
        window.removeEventListener('token-expired', handleTokenExpired)
    })

    return {
        // 状态
        showLoginModal,
        loginModalMode,
        userStore,

        // 方法
        openLoginModal,
        closeLoginModal,
        handleLoginSuccess,
        handleLogout,
        checkAuthStatus,

        // 计算属性
        isLoggedIn: userStore.isAuthenticated,
        userInfo: userStore.userInfo,
        username: userStore.username,
        avatar: userStore.avatar
    }
}

/**
 * 全局登录状态管理
 * 提供给需要检查登录状态的组件使用
 */
export function useAuth() {
    const userStore = useUserStore()

    /**
     * 需要登录的操作包装器
     * @param {Function} action - 需要执行的操作
     * @param {string} message - 未登录时的提示信息
     */
    const requireAuth = (action, message = '请先登录') => {
        return (...args) => {
            if (!userStore.isAuthenticated) {
                ElMessage.warning(message)
                // 触发显示登录框事件
                window.dispatchEvent(new CustomEvent('show-login-modal'))
                return Promise.reject(new Error(message))
            }

            return action(...args)
        }
    }

    /**
     * 路由守卫助手
     * @param {Object} to - 目标路由
     * @param {Object} from - 来源路由
     * @param {Function} next - 路由导航函数
     */
    const authGuard = (to, from, next) => {
        if (to.meta?.requireAuth && !userStore.isAuthenticated) {
            // 保存要访问的路径，登录后跳转
            sessionStorage.setItem('redirectPath', to.fullPath)

            // 触发显示登录框
            window.dispatchEvent(new CustomEvent('show-login-modal'))

            // 停留在当前页面
            next(false)
            return
        }

        next()
    }

    return {
        userStore,
        requireAuth,
        authGuard,
        isAuthenticated: userStore.isAuthenticated,
        userInfo: userStore.userInfo
    }
}